package com.jzo2o.health.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jzo2o.api.trade.dto.response.TradingResDTO;
import com.jzo2o.api.trade.enums.PayChannelEnum;
import com.jzo2o.common.model.PageResult;
import com.jzo2o.health.model.domain.Orders;
import com.jzo2o.health.model.domain.OrdersCancelled;
import com.jzo2o.health.model.dto.request.OrdersCancelReqDTO;
import com.jzo2o.health.model.dto.request.OrdersPageQueryReqDTO;
import com.jzo2o.health.model.dto.request.PlaceOrderReqDTO;
import com.jzo2o.health.model.dto.response.*;

import java.util.List;

/**
 * <p>
 * 订单表 服务类
 * </p>
 *
 * @author itcast
 * @since 2023-11-02
 */
public interface IOrdersService extends IService<Orders> {

    /**
     * 预约下单
     *
     * @param placeOrderReqDTO 下单请求模型
     * @return 订单号
     */
    PlaceOrderResDTO placeOrder(PlaceOrderReqDTO placeOrderReqDTO);

    /**
     * 用户端滚动分页查询
     *
     * @param ordersStatus 订单状态，0：未支付，100：待体检，200：已体检，300：已关闭，400：已取消
     * @param sortBy       排序字段
     * @return 分页结果
     */
    List<OrdersResDTO> memberPageQuery(Integer ordersStatus, Long sortBy);

    /**
     * 用户端订单详情
     *
     * @param id 订单id
     * @return 订单详情
     */
    OrdersDetailResDTO getDetail(Long id);

    /**
     * 订单支付
     *
     * @param id             订单id
     * @param tradingChannel 支付渠道：ALI_PAY、WECHAT_PAY
     * @return 订单支付响应体
     */
    OrdersPayResDTO pay(Long id, PayChannelEnum tradingChannel);

    /**
     * 请求支付服务查询支付结果
     *
     * @param id 订单id
     * @return 订单支付响应体
     */
    int getPayResultFromTradServer(Long id);

    /**
     * 支付成功，更新订单
     *
     * @param tradingResDTO 第三方支付响应结果
     */
    void paySuccess(TradingResDTO tradingResDTO);

    /**
     * 管理端分页查询
     *
     * @param ordersPageQueryReqDTO 分页查询请求
     * @return 分页结果
     */
    PageResult<OrdersResDTO> adminPageQuery(OrdersPageQueryReqDTO ordersPageQueryReqDTO);

    /**
     * 订单信息聚合
     *
     * @param id 订单id
     * @return 订单信息
     */
    AdminOrdersDetailResDTO aggregation(Long id);

    /**
     * 订单取消
     *
     * @param ordersCancelReqDTO 订单取消模型
     */
    void cancel(OrdersCancelReqDTO ordersCancelReqDTO);

    /**
     * 订单取消
     *
     * @param id              订单id
     * @param ordersCancelled 订单取消模型
     */
    void cancel(Long id, OrdersCancelled ordersCancelled);

    /**
     * 订单退款
     *
     * @param ordersCancelReqDTO 订单退款模型
     */
    void refund(OrdersCancelReqDTO ordersCancelReqDTO);

    /**
     * 更新支付状态
     *
     * @param id        订单id
     * @param payStatus 支付状态
     * @param refundId  第三方支付的退款单号
     * @param refundNo  支付服务退款单号
     */
    void updateRefundStatus(Long id, Integer payStatus, String refundId, Long refundNo);

    /**
     * 查询超时订单id列表
     *
     * @param count 数量
     * @return 订单id列表
     */
    List<Orders> queryOverTimePayOrdersListByCount(Integer count);

    /**
     * 根据状态统计数量
     *
     * @return 订单数量
     */
    OrdersCountResDTO countByStatus();
}
